<?php
/**
 * Класс User Базовый класс пользователя
 *  @author Mike
 */

class User_User extends ActiveRecord {
	protected $tableName = 'user';
	protected $pkName = 'ID_user';
	protected $arrSettings = array('created_at' => true);
	
	protected $availableFields = array ('ID_user', 'ID_city', 'first_name', 'last_name', 'first_name', 'sex', 'line', 'e_mail' => 'create', 'date_birth', 'phone', 'favorite_team', 'favorite_player', 'favorite_number', 'search_status', 'password' => 'create', 'avatar_filename');

	public $validatesLengthOf = array(
			'first_name' => array('min' => 2, 'max' => 64, 'message' => 'Имя должно состоять из 2-64 символов'),
			'last_name' => array('min' => 2, 'max' => 64, 'message' => 'Фамилия должна состоять из 2-64 символов'),
			'password' => array('min' => 6, 'max' => 64, 'message' => 'Пароль заполнен неверно (6-64 симолов)', 'on' => 'create')
			);

	public $validatesFormatOf = array(
				'e_mail' => array('with' => '/^([a-z0-9_\.\-]{1,20})@([a-z0-9\.\-]{1,20})\.([a-z]{2,4})$/i', 'message' => 'Электронная почта заполнена неверно', 'on' => 'create'),
				'first_name' => array('message' => 'Имя - только русские и латинские буквы', 'with' => '/^[а-яa-z]*$/iu'),
				'last_name' => array('message' => 'Фамилия - только русские и латинские буквы', 'with' => '/^[а-яa-z]*$/iu'),
				'phone' => array('message' => 'Телефон - от 10 до 15 цифр', 'with' => '/^[0-9]{10,15}$/i', 'allowNull' => true)
		);
	
	// Типы амплуа и их значения
	public static $linesArray = array(
								1 => 'Вратарь',
								2 => 'Защитник',
								3 => 'Полузащитник',
								4 => 'Нападающий'
						);
	
	public function beforeValidationOnCreate() {
		// Проверяем совпдает ли пароль и его подтверждение
		if($this->tableFields['password'] != $this->tableFields['confirm']) $this->arrErrors[] = 'Пароль и его подтверждение не совпдает';	
		unset ($this->tableFields['confirm']);
		
		// Проверяем не занята ли почта
		if(!$this->isFreeEmail($this->getField('e_mail'))) $this->arrErrors[] = 'Почта уже существует';
	}
	
	public function beforeCreate() {
		$this->setField('password', $this->makePasswordString());
	}
	
	public function beforeUpdate() {
		// Если в POST есть город, но его значение пусто 
		if(isset($this->tableFields['city_name']) && $this->tableFields['city_name'] == '') $this->setField('ID_city', null);
		unset($this->tableFields['city_name']);

		if(isset($this->tableFields['line']) && $this->tableFields['line'] == 0) $this->tableFields['line'] = null;
		
		// Проверяем поля даты(день, месяц, год)
		$flag = true;
		if(isset($this->tableFields['day']) && isset($this->tableFields['month']) && isset($this->tableFields['year'])) {
			if(!$this->tableFields['day'] || !$this->tableFields['month'] || !$this->tableFields['year']) $flag = false;
			elseif($this->tableFields['month'] == 2 && ($this->tableFields['day'] > 29 || ($this->tableFields['day'] == 29 && $this->tableFields['year'] % 4))) $flag = false;
			elseif(($this->tableFields['month'] < 8 && $this->tableFields['day'] == 31 && !($this->tableFields['month'] % 2 )) || ($this->tableFields['month'] > 7 &&  $this->tableFields['day'] == 31 && $this->tableFields['month'] % 2)) $flag = false;
			
			if(!$flag) $this->setField('date_birth', null);
			else $this->setField('date_birth', $this->tableFields['year'] . '-' . $this->tableFields['month'] . '-' . $this->tableFields['day']);
			unset($this->tableFields['day'], $this->tableFields['month'], $this->tableFields['year']);
		}
	}
	
	protected function afterCreate() {
		User_Seance::authorizationIn($this);
	}
	
	/**
	 * Метод проверяет существование пользователя в БД с заданным e-mail
	 * 
	 * @param string $email - e-mail для проверки
	 * @return bool
	 */
	public function isFreeEmail($eMail) {
		$objDB = Service_Database::instanse();
		$stmt = "SELECT `user`.`ID_user` 
				 FROM `user` 
				 WHERE `user`.`e_mail` = '" . Service_Escape::absolutelyEscapeString($eMail) . "'";
		if($objDB->selectOneValue($stmt)) return false;
		else return true;
	}
	
	// В этом методе из трёх элементов массива POST (birth_day,birth_month,birth_year) получаем строку даты для сохранения, после чего первые элементы удаляются из массива объекта
	// А также обнуляем 
	public function beforeCheckFields() {
		// Из 3 селектов (Год, месяц, день) собираем строку для сохранения даты - год-месяц-день
		if(isset($_POST['User']['birth_day']) && isset($_POST['User']['birth_month']) && isset($_POST['User']['birth_year'])) {
			$this->tableFields['date_birth'] = $_POST['User']['birth_year'] . '-' . $_POST['User']['birth_month'] . '-' . $_POST['User']['birth_day'];	
			//Удаляем отдельные записи (число, месяц, год)
			unset ($this->tableFields['birth_day'],$this->tableFields['birth_month'],$this->tableFields['birth_year']);
		}
		// Обнуляем необязательные поля профиля, которые пользователь не заполнил
		foreach ($this->tableFields as $key => $value) if ($value == '') $this->tableFields[$key] = null;
	}
	
	/**
	 * Метод проверяет, может ли пользователь быть залогинен
	 * @return boolean
	 */
	public function canSignIn() {
		$eMail = $this->getField('e_mail');
		$this->tableFields = Service_Escape::absolutelyEscapeArray($this->tableFields);
		$this->validateFormatOf('e_mail', $this->validatesFormatOf['e_mail']);
		$this->validateFormatOf('password', $this->validatesLengthOf['password']);
		$this->find('first', array('conditions' => "`user`.`e_mail`='" . $eMail . "' AND `user`.`password`='" . $this->makePasswordString() . "'"));
		if($this->id) return true;
		
		$this->setField('e_mail', $eMail);	// Возвращаем в объект, чтобы отобразилось в текстовом поле
		$this->errorValidated('', 'Неверный e-mail или пароль');
		return false;
	}
	
	/**
	 * Метод формирует строку password в таблице user
	 * 
	 */
	public function makePasswordString() {
		return md5($this->getField('e_mail') . $this->getField('password') . 'outsider');
	}
}

?>